package com.tronsis.library.util;

import android.content.Context;
import android.text.TextUtils;


import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import static android.content.ContentValues.TAG;

/**
 * @author scofield@tronsis.com
 * @date 2017/7/12 12:30
 */

public class DateUtil {
    private static final String DEFAULT_STRING = "yyyy-MM-dd'T'HH:mm:ss";
    private static final DateFormat DEFAULT_FORMAT = new SimpleDateFormat(DEFAULT_STRING, Locale.getDefault());
    public static final String SP_SERVER_CURRENT_TIME_DIFFERENCE_VALUE = "server_current_time_difference_value";//服务器时间与本地的时间差

    /**
     * 将时间字符串转为Date类型
     *
     * @param time 时间字符串
     * @return Date类型
     */
    public static Date string2Date(final String time) {
        return string2Date(time, DEFAULT_FORMAT);
    }

    /**
     * 将时间字符串转为Date类型
     *
     * @param time   时间字符串
     * @param format 时间格式
     * @return Date类型
     */
    public static Date string2Date(final String time, final DateFormat format) {
        try {
            return format.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将Date类型转为时间字符串
     *
     * @param date Date类型时间
     * @return 时间字符串
     */
    public static String date2String(final Date date) {
        return date2String(date, DEFAULT_FORMAT);
    }

    /**
     * 将Date类型转为时间字符串
     *
     * @param date   Date类型时间
     * @param format 时间格式
     * @return 时间字符串
     */
    public static String date2String(final Date date, final DateFormat format) {
        return format.format(date);
    }


    /**
     * @param string
     * @param format
     * @return
     */
    public static String date2String(final String string, final DateFormat format) {
        return format.format(string2Date(string));
    }


    public static String iso8601ToDay(String timeStringIso8601) {
        Date date = string2Date(timeStringIso8601);
        DateFormat df = new SimpleDateFormat("MM.dd");
        String s = date2String(date, df);
        return s;
    }

    public static String iso8601ToTime(String timeStringIso8601) {
        Date date = string2Date(timeStringIso8601);
        DateFormat df = new SimpleDateFormat("HH:mm");
        String s = date2String(date, df);
        return s;
    }

    public static String iso8601ToYMDHMS(String timeStringIso8601) {
        Date date = string2Date(timeStringIso8601);
        DateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        String s = date2String(date, df);
        return s;
    }

    public static Date getLocalTimeDate(String timeStringIso8601) {
        Calendar calendar = Calendar.getInstance();
        Date date = string2Date(timeStringIso8601);
        calendar.set(date.getYear(), date.getMonth(), date.getDay(), date.getHours(), date.getMinutes(), date.getSeconds());
        calendar.setTimeZone(TimeZone.getTimeZone("GMT-06:00"));
        Calendar calendarLocal = Calendar.getInstance();
        // 修改时区之后，通过calendar的get方法
        calendarLocal.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND));
        LogUtil.e("japen calendar.get", calendar.get(Calendar.MONTH) + "." + calendar.get(Calendar.DAY_OF_MONTH) + " " + calendar.get(Calendar.HOUR_OF_DAY) +
                ":" + calendar.get(Calendar.MINUTE));
        return calendarLocal.getTime();
    }

    /**
     * 将服务器零时区的时间转换成本地时间
     *
     * @param dateStr
     * @return
     */
    public static Date getDateServerToLocal(String dateStr) {
        if (TextUtils.isEmpty(dateStr)) {
            return null;
        }
        LogUtil.d("Date", "转换前时间：" + dateStr);
        Date dateTmp = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_STRING);
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        try {
            // 对于已经设定为GMT时间标准的dateFormat来说，一切需要他转换的字符串日期都是GMT标准时间，转换后返回的Date由于默认遵守系统默认时区，所以转换给Date的日期需要+8（例如北京标准时区），也就是时区与标准不同导致的时差。
            dateTmp = dateFormat.parse(dateStr);
            SimpleDateFormat dateFormat2 = new SimpleDateFormat(DEFAULT_STRING);// Date还是按系统默认时区，而format格式化处来的字符串是GMT，所以要-8。
            LogUtil.d("Date", "转换后时间：" + dateFormat2.format(dateTmp));

            return dateTmp;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateTmp;
    }

    public static Date getStringToDate(String dateStr) {
        if (TextUtils.isEmpty(dateStr)) {
            return null;
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_STRING);
        try {
            Date date = dateFormat.parse(dateStr);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String getDateString(String dateStr, String formatStr) {
        Date date = getStringToDate(dateStr);
        if (date == null) {
            return "";
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat(formatStr);
        return dateFormat.format(date);
    }

    public static String getDateString(String dateStr) {
        return getDateString(dateStr,"yyyy/MM/dd");
    }

    public static String getDateTimeString(String dateStr) {
        return getDateString(dateStr,"yyyy/MM/dd HH:mm:ss");
    }

    /**
     * 将服务器零时区的时间转换成本地时间
     *
     * @param dateStr
     * @return
     */
    public static String getDateServerToLocalString(String dateStr) {
        Date dateTmp = new Date();
        String string = "";
        SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_STRING);
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        try {
            // 对于已经设定为GMT时间标准的dateFormat来说，一切需要他转换的字符串日期都是GMT标准时间，转换后返回的Date由于默认遵守系统默认时区，所以转换给Date的日期需要+8（例如北京标准时区），也就是时区与标准不同导致的时差。
            dateTmp = dateFormat.parse(dateStr);
            SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// Date还是按系统默认时区，而format格式化处来的字符串是GMT，所以要-8。
            string = dateFormat2.format(dateTmp);
//            LogUtil.d("Date", "转换后时间：" +string);

            return string;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return string;
    }

    public static String getDataServiceString(String data) {
        Date dateTmp = new Date();
        String string = "";
        SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_STRING);
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        try {
            // 对于已经设定为GMT时间标准的dateFormat来说，一切需要他转换的字符串日期都是GMT标准时间，转换后返回的Date由于默认遵守系统默认时区，所以转换给Date的日期需要+8（例如北京标准时区），也就是时区与标准不同导致的时差。
            dateTmp = dateFormat.parse(data);
            SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm");// Date还是按系统默认时区，而format格式化处来的字符串是GMT，所以要-8。
            string = dateFormat2.format(dateTmp);
//            LogUtil.d("Date", "转换后时间：" +string);

            return string;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return string;
    }

    public static String getCurrentTime(String dateStr) {
        if (TextUtils.isEmpty(dateStr)) {
            return "";
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_STRING);
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        try {
            // 对于已经设定为GMT时间标准的dateFormat来说，一切需要他转换的字符串日期都是GMT标准时间，转换后返回的Date由于默认遵守系统默认时区，所以转换给Date的日期需要+8（例如北京标准时区），也就是时区与标准不同导致的时差。
            Date dateTmp = dateFormat.parse(dateStr);
            System.out.println(dateTmp);
            SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd");// Date还是按系统默认时区，而format格式化处来的字符串是GMT，所以要-8。
            return dateFormat2.format(dateTmp);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateStr;
    }

    /**
     * 计算时间差
     *
     * @param starTime 开始时间
     * @param endTime  结束时间
     *                 返回类型 ==1----天，时，分。 ==2----时
     * @return 返回时间差
     */
    public static String getTimeDifference(String starTime, String endTime) {
        String timeString = "";
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        try {
            Date parse = dateFormat.parse(starTime);
            Date parse1 = dateFormat.parse(endTime);
            long diff = parse1.getTime() - parse.getTime();
            long day = diff / (24 * 60 * 60 * 1000);
            long hour = (diff / (60 * 60 * 1000) - day * 24);
            long min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
            long s = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
            long ms = (diff - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000
                    - min * 60 * 1000 - s * 1000);
            LogUtil.e("时间差", day + "天" + hour + "小时" + min + "分" + s + "秒");
            timeString = day + "天" + hour + "小时" + min + "分" + s + "秒";
            long hour1 = diff / (60 * 60 * 1000);
            String hourString = hour1 + "";
            long min1 = ((diff / (60 * 1000)) - hour1 * 60);
            //timeString = hour1 + "小时" + min1 + "分";

            // System.out.println(day + "天" + hour + "小时" + min + "分" + s +
            // "秒");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return timeString;
    }

    /**
     * 获取服务器的时间
     * 时间差在http数据头已存储
     *
     * @param context
     * @return
     */
    public static long getServerCurrentTime(Context context) {
        long serverCurrentTime = System.currentTimeMillis() + SharedPreferencesUtil.getLong(context, SP_SERVER_CURRENT_TIME_DIFFERENCE_VALUE, 0);
        LogUtil.d(TAG, "getServerCurrentTime: " + new Date(serverCurrentTime).toString());
        LogUtil.d(TAG, "time: " + SharedPreferencesUtil.getLong(context, SP_SERVER_CURRENT_TIME_DIFFERENCE_VALUE, 0));
        return serverCurrentTime;
    }

    /*
        将时间戳转换为时间
     */
    public static String stampToDate(long timeMillis) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date(timeMillis);
        return simpleDateFormat.format(date);
    }

    /**
     * 获取时间间隔
     *
     * @param millisecond
     * @return
     */
    public static Long getSpaceTime(Long millisecond) {
        Calendar calendar = Calendar.getInstance();
        Long currentMillisecond = calendar.getTimeInMillis();

        //间隔秒
        Long spaceSecond = (currentMillisecond - millisecond) / 1000;

        return spaceSecond;
    }

    /**
     * 将时间转化成毫秒
     * 时间格式: yyyy-MM-dd HH:mm:ss
     *
     * @param time
     * @return
     */
    public static Long timeStrToSecond(String time) {
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Long second = format.parse(time).getTime();
            return second;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return -1l;
    }

    /**
     * 将传入日期转换为今天，昨天或者日期
     *
     * @param date yyyy-MM-dd格式的日期
     * @return
     */
    public static String getTodayYesterdayDate(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            if (sdf.parse(date) != null) {
                Calendar cal = Calendar.getInstance();
                if (cal.get(Calendar.YEAR) == Integer.valueOf(date.substring(0, 4))
                        && cal.get(Calendar.MONTH) + 1 == Integer.valueOf(date.substring(5, 7))
                        && cal.get(Calendar.DAY_OF_MONTH) == Integer.valueOf(date.substring(8, 10))) {
                    return "今天";
                }
                cal.add(Calendar.DAY_OF_YEAR, -1);
                if (cal.get(Calendar.YEAR) == Integer.valueOf(date.substring(0, 4))
                        && cal.get(Calendar.MONTH) + 1 == Integer.valueOf(date.substring(5, 7))
                        && cal.get(Calendar.DAY_OF_MONTH) == Integer.valueOf(date.substring(8, 10))) {
                    return "昨天";
                }
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return date;
    }

    /**
     * 判断传入日期是否为今天
     *
     * @param date yyyy-MM-dd格式的日期
     * @return
     */
    public static boolean isToday(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            if (sdf.parse(date) != null) {
                Calendar cal = Calendar.getInstance();
                if (cal.get(Calendar.YEAR) == Integer.valueOf(date.substring(0, 4))
                        && cal.get(Calendar.MONTH) + 1 == Integer.valueOf(date.substring(5, 7))
                        && cal.get(Calendar.DAY_OF_MONTH) == Integer.valueOf(date.substring(8, 10))) {
                    return true;
                }
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return false;
    }

    public static String getDateLocalToServer(String localDateStr) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        Date tempDate;
        try {
            tempDate = dateFormat.parse(localDateStr);
            SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
            dateFormat1.setTimeZone(TimeZone.getTimeZone("GMT"));
            return dateFormat1.format(tempDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return "";
    }

}
